home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
171_01
/
timemark.txt
< prev
next >
Wrap
Text File
|
1983-09-16
|
9KB
|
298 lines
/*****************************************************************************/
This file contains (4) source code files which are to be extracted and
made into individual files. Their names are "gtest.c", "gtime.c", "times.c",
and "sysint.asm". Using the Personal Editor, use Alt-B to mark the begin-
ning and end of a file. Then hit escape and enter for example "edit gtest.c"
or "edit c:gtest.c" Since this is a new file no text will appear until you
hit escape to return to the text entry mode and hit Alt-Z. The marked
portion will now load. Hit enter and put "save" on the command line. Now
do a "quit". You will now return to the main file. Now do an Alt-U to remove
the marked area. Repeat the marking, naming and saving out for each of the
files. Next use your Lattice-C compiler to obtain a ".obj" file for the
".c" source files and the Macro Assembler to obtain a ".obj" file for the
".asm" source. Finally, enter "Link c+gtest+gtime+times+sysint". I called
the final executable file "Timemark". We thank Ed Keating who is the C-Sig
co-ordinator for the Northern Illinois IBM-PC User's Group" for the writing
of these routines. I made this single file put-together for the convenience
of only having to download one file from this BBS.
^^^ Dick Stone ^^^
/*****************************************************************************/
/*
* .title gtest.c---Timestamp program for testing Lattice C
*/
#include <stdio.h>
main(argc,argv)
int argc;
char *argv[];
{
looptest(); /* perform simple loop test */
addints(); /* add integers test */
fptest(); /* floating point test */
strings(); /* string concatenation */
tables(); /* table lookup test */
printf("End benchmarks\n");
}
/*
* this is a routine to print the timestamped differences to standard output
*/
printimes(t1,t2)
int t1[8],t2[8]; /* timestamp buffers */
{
long d,tdiff(); /* for time difference calculations */
char tsbuf[20]; /* used to format time info */
char *ftime(); /* formats a timestamp into a buffer */
printf("Time started was %s\n",ftime(t1,tsbuf));
printf("Time ended was %s\n",ftime(t2,tsbuf));
d = tdiff(t1,t2);
printf("The difference in times in Milliseconds is %ld\n",d);
} /* end of printimes*/
looptest() /* basic loop test */
{
int i,t1[8],t2[8]; /* timestamp buffers */
gtime(t1); /* get time one. */
for(i =0; i < 10000; i++);
gtime(t2);
printf("\nSimple loop test\n");
printimes(t1,t2);
}
addints() /* add integers test */
{
int i,t1[8],t2[8]; /* timestamp buffers */
printf("\nAdding integers loop to 32767\n");
gtime(t1);
i = 0;
while(i < 32767) i++;
gtime(t2);
printimes(t1,t2);
}
fptest() /* floating point test */
{
int i,t1[8],t2[8]; /* timestamp buffers */
double a,b,c;
printf("\nFloating point benchmark\n");
gtime(t1);
a = 0; b = 1234.56; c = 78.9;
for(i = 0; i < 10000; i++) {
a=b*c;
a=b/c;
}
gtime(t2);
printimes(t1,t2);
}
strings()
{
int i,t1[8],t2[8]; /* timestamp buffers */
char *pa,*pb,*pc;
static char sa[] = "This is a string";
static char sb[] = "This is a longer string with lots of words in it";
char sc[100];
printf("\nString concatenation benchmark\n");
gtime(t1);
for(i = 0; i < 10000; i++) {
pc = &sc[0];
pa = &sa[0];
pb = &sb[0];
while(*pc++ = *pa++); /* copy up to first null */
pc--; /* back up over trailing null */
while(*pc++ = *pb++); /* add in the second string */
}
gtime(t2);
printimes(t1,t2);
}
tables() /* table lookup tests */
{
int i,j,t1[8],t2[8]; /* timestamp buffers */
static int data[25] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25 };
int array[25];
printf("\nTable lookup\n");
gtime(t1);
for(i = 0; i < 1000; i++)
for(j = 0; j < 25; j++) array[j] = data[j];
gtime(t2);
printimes(t1,t2);
} /* End of gtest.c */
/*****************************************************************************/
/*
;
; .title gtime.c
;
; Index gtime -- get system time into raw 8 word format
;
; Usage
; gtime(buffer);
;
; In
; int buffer[8]; ; 8 word buffer for timestamp
;
; Out
; int buffer[8]; ; 8 word buffer will contain timestamp
;
; Description
; This routine will get the system time and date and return it
; in the 8 word buffer provided.
; The buffer contains year (1980-2099), month 1-12, day 1-32
; hour(0 - 23) minute (0-59) second (0-59) , milliseconds (0 - 999)
; and the timer resolution in milliseconds.( On pc = 055)
;
; status
; returns pointer to start of timerstruct.
;
; bugs
; Uses Sysint to talk to Pcdos
;
; Updates
; date vers who Description
; 27-aug-83 0001 EJK Initial coding
;
;-
*/
#include <stdio.h>
struct dosstruct {
char al,ah;
char bl,bh;
char cl,ch;
char dl,dh;
};
struct dosregs {
int ax,bx,cx,dx;
}; /* used for casting */
struct timerbuf {
int year,month,day,hour,minute,second,millisec,timres;
};
#define TIMEFUNCTION 0x2c /* time subfunction */
#define DATEFUNCTION 0x2a /* date subfunction */
#define DOSINT 0x21 /* dos interrupt code */
#define TIMRES 055 /* milliseconds resolution */
struct timerbuf *gtime(timbuf)
struct timerbuf *timbuf;
{
struct dosstruct dosiobuf;
struct dosstruct *in = &dosiobuf;
struct dosstruct *out= &dosiobuf;
/* first, get the date. with system function 2a to dos */
in->ah = DATEFUNCTION;
sysint(DOSINT,in,out); /* do it! */
timbuf->year = ((struct dosregs *)out)->cx; /* cast for 16bit */
timbuf->month = out->dh;
timbuf->day = out->dl;
/* now, the time */
in->ah = TIMEFUNCTION;
sysint(DOSINT,in,out);
timbuf->hour = out->ch;
timbuf->minute = out->cl;
timbuf->second = out->dh;
timbuf->millisec = out->dl * 10; /* make into milliseconds */
timbuf->timres = TIMRES;
return(timbuf); /* return pointer to his struct */
} /* end of gtime */
/*****************************************************************************/
/* .title times.c
* tdiff -- return the time difference between a start time and an end time
* long tdiff(start,end )
* where: start and end are 8 word timestamp buffers
*/
long tdiff(t1,t2)
int t1[8],t2[8]; /* timestamp buffers */
{
long d; /* work variable */
d = t2[3] - t1[3];
d = d*60 + t2[4] - t1[4];
d = d*60 + t2[5] - t1[5];
d = d*1000 + t2[6] - t1[6];
return(d);
}
/*
* ftime -- formats a timestamp into a buffer in the form
* hh:mm:ss.msc ( null terminated )
* returns a pointer to the start of the buffer
*/
char *ftime(t1,buf)
int t1[]; /* timestamp */
char *buf; /* buffer */
{
sprintf(buf,"%2.2d:%2.2d:%2.2d.%3.3d\0",t1[3],t1[4],t1[5],t1[6]);
return(buf); /* return pointer to start */
} /* end of times.c */
/*****************************************************************************/
; page 66,132
;+
; .title sysint.asm
; index system interrupt call function sysint()
;
; Usage
; sysint(inum,&inreg,&outreg);
;
; in
; int inum; ; interrupt number to execute
; int inreg[4]; ; input registers ax,bx,cx,dx
;
; out
; int outreg[4]; ; registers returned ax,bx,cx,dx
;
; Description
; This is a system interface call to allow system intrinsic functions
; to be called from C. Parameters are passed via the register values
; stored in inreg for input to the system call and returned in the
; outreg struct. The default values for the segment registers are the
; same as C routines.
;
; status
; ax register is returned as status
;
; bugs
; low level internal routine must be modified to be ported.
;
; Updates
;
; date vers who description
; 15-aug-83 0001 EJK Added documemtation
;-
pgroup group prog
prog segment byte public 'prog'
assume cs:pgroup
public sysint
sysint proc near
push bp ;save bp
mov bp,sp ;sp->bp
mov ax,[bp]+4 ;get int#
mov cs:itm+1,al ;set int#
mov si,[bp]+6 ;in struc
mov ax,[si] ;set ax
mov bx,[si]+2 ;set bx
mov cx,[si]+4 ;set cx
mov dx,[si]+6 ;set dx
push bp ;save bp2
itm equ this byte ; 'this byte' is a keyword.